
package Persistencia.daos;

import Persistencia.CRUD;
import Persistencia.DAO;
import Persistencia.SeqHelper;
import Persistencia.modelos.Campeonato;
import Persistencia.modelos.Estadio;
import Persistencia.modelos.Partida;
import Persistencia.modelos.Time;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;

public class PartidaDAO implements DAO<Integer, Partida> {

    public void salva(Partida obj) {        
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");        
        int i = SeqHelper.getId("partida");        
        String campos = "nroPartida, idTimeMandante, idTimeVisitante, idCampeonato, idEstadio, qtdeTorcedores, nroRodada,dataPartida, flagOcorreuPartida";    
        String valores = i + ", " + 
                ((obj.getTimeMandante()==null)?"null, ": obj.getTimeMandante().getIdTime() + ", ") + 
                ((obj.getTimeVisitante()==null)?"null, ": obj.getTimeVisitante().getIdTime() + ", ") +
                ((obj.getCampeonato()==null)?"null, ":obj.getCampeonato().getIdCampeonato() + ", ") + 
                ((obj.getEstadio()==null)?"null, ":obj.getEstadio().getIdEstadio() + ", ") + 
                obj.getQtdeTorcedores() + ", " +
                obj.getNroRodada() + ", " +
                ((obj.getDataPartida()==null)?"null, ":("'" + sdf.format(obj.getDataPartida()) + "', ")) + 
                ((obj.isFlagOcorreuPartida())?"1":"0");        
        CRUD.adiciona("Partida", campos, valores);
        obj.setNroPartida(i);            
    }

    public void atualiza(Partida obj) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        
        List<String> campos = new ArrayList<String>();
        if (obj.getTimeMandante()!=null)
            campos.add("idTimeMandante");
        if (obj.getTimeVisitante()!=null)
            campos.add("idTimeVisitante");
        if (obj.getCampeonato()!=null);
            campos.add("idCampeonato");
        if (obj.getEstadio()!=null);
            campos.add("idEstadio");        
        campos.add("qtdeTorcedores");
        campos.add("nroRodada");
        campos.add("dataPartida");
        campos.add("flagOcorreuPartida");
        
        List<String> valores = new ArrayList<String>();
        if (obj.getTimeMandante()!=null)
            valores.add(String.valueOf(obj.getTimeMandante().getIdTime()));        
        if (obj.getTimeVisitante()!=null)
            valores.add(String.valueOf(obj.getTimeVisitante().getIdTime()));        
        if (obj.getCampeonato()!=null);
            valores.add(String.valueOf(obj.getCampeonato().getIdCampeonato()));        
        if (obj.getEstadio()!=null);
            valores.add(String.valueOf(obj.getEstadio().getIdEstadio()));        
        valores.add(String.valueOf(obj.getQtdeTorcedores()));
        valores.add(String.valueOf(obj.getNroRodada()));
        valores.add("'"+sdf.format(obj.getDataPartida())+"'");
        valores.add((obj.isFlagOcorreuPartida())?"1":"0");
            
        CRUD.atualiza("partida", campos, valores, " where nroPartida = " + obj.getNroPartida());
    }

    public void deleta(Integer obj) {
        List<Integer> ints = new ArrayList<Integer>();
        ints.add(obj);
        CRUD.deleta("partida", "nroPartida", ints);
    }

    public Partida recupera(Integer obj) {
        try { 
            ResultSet rs = CRUD.consulta("select * from PARTIDA where nroPartida = " + obj);
            
            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> campeonatosAux = new TreeSet<Integer>();
            Collection<Integer> estadiosAux = new TreeSet<Integer>();
            
            Partida p = null;
            while (rs.next()){
                p = new Partida();
                p.setNroPartida(rs.getInt("nroPartida"));
                p.setIdTimeMandante(rs.getInt("idTimeMandante"));
                p.setIdTimeVisitante(rs.getInt("idTimeVisitante"));                                
                p.setIdCampeonato(rs.getInt("idCampeonato"));
                p.setIdEstadio(rs.getInt("idEstadio"));
                p.setQtdTorcedores(rs.getInt("qtdeTorcedores"));
                p.setNroRodada(rs.getInt("nroRodada"));
                p.setDataPartida(rs.getDate("dataPartida"));
                p.setFlagOcorreuPartida(rs.getBoolean("flagOcorreuPartida"));
                
                timesAux.add(p.getIdTimeMandante());
                timesAux.add(p.getIdTimeVisitante());
                campeonatosAux.add(p.getIdCampeonato());
                estadiosAux.add(p.getIdEstadio());
            }
                                   
            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<Campeonato> campeonatos = new CampeonatoDAO().recuperaLista(campeonatosAux);
            Collection<Estadio> estadios = new EstadioDAO().recuperaLista(estadiosAux);
            
            preencheRelacionamentos(times, p, campeonatos, estadios);
                        
            return p;
        } catch (SQLException e){
         throw new RuntimeException(e);
        }      
    }

    public Collection<Partida> recuperaLista(Collection<Integer> chaves) {
        StringBuilder sb = new StringBuilder();
        Iterator<Integer> it = chaves.iterator();
        while (it.hasNext()){
            sb.append(it.next()).append(",");
        }
        String ids = sb.toString().substring(0, sb.toString().length()-1);
        
        try {                                 
            ResultSet rs = CRUD.consulta("select * from PARTIDA where nroPartida in (" + ids + ")");
            
            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> campeonatosAux = new TreeSet<Integer>();
            Collection<Integer> estadiosAux = new TreeSet<Integer>();
            
            Collection<Partida> partidas = new ArrayList<Partida>();
            while (rs.next()){
                Partida p = new Partida();
                p.setNroPartida(rs.getInt("nroPartida"));
                p.setIdTimeMandante(rs.getInt("idTimeMandante"));
                p.setIdTimeVisitante(rs.getInt("idTimeVisitante"));                                
                p.setIdCampeonato(rs.getInt("idCampeonato"));
                p.setIdEstadio(rs.getInt("idEstadio"));
                p.setQtdTorcedores(rs.getInt("qtdeTorcedores"));
                p.setNroRodada(rs.getInt("nroRodada"));
                p.setDataPartida(rs.getDate("dataPartida"));
                p.setFlagOcorreuPartida(rs.getBoolean("flagOcorreuPartida"));
                
                timesAux.add(p.getIdTimeMandante());
                timesAux.add(p.getIdTimeVisitante());
                campeonatosAux.add(p.getIdCampeonato());
                estadiosAux.add(p.getIdEstadio());
                
                partidas.add(p);
            }
                                   
            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<Campeonato> campeonatos = new CampeonatoDAO().recuperaLista(campeonatosAux);
            Collection<Estadio> estadios = new EstadioDAO().recuperaLista(estadiosAux);
                        
            for (Partida p : partidas) {
                preencheRelacionamentos(times, p, campeonatos, estadios);                
            }
                        
            return partidas;
        } catch (SQLException e){
         throw new RuntimeException(e);
        }    
    }

    public Collection<Partida> recuperaTodos() {
        try {             
            ResultSet rs = CRUD.consulta("select * from PARTIDA");
            
            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> campeonatosAux = new TreeSet<Integer>();
            Collection<Integer> estadiosAux = new TreeSet<Integer>();
            
            Collection<Partida> partidas = new ArrayList<Partida>();
            while (rs.next()){
                Partida p = new Partida();
                p.setNroPartida(rs.getInt("nroPartida"));
                p.setIdTimeMandante(rs.getInt("idTimeMandante"));
                p.setIdTimeVisitante(rs.getInt("idTimeVisitante"));                                
                p.setIdCampeonato(rs.getInt("idCampeonato"));
                p.setIdEstadio(rs.getInt("idEstadio"));
                p.setQtdTorcedores(rs.getInt("qtdeTorcedores"));
                p.setNroRodada(rs.getInt("nroRodada"));
                p.setDataPartida(rs.getDate("dataPartida"));
                p.setFlagOcorreuPartida(rs.getBoolean("flagOcorreuPartida"));
                
                timesAux.add(p.getIdTimeMandante());
                timesAux.add(p.getIdTimeVisitante());
                campeonatosAux.add(p.getIdCampeonato());
                estadiosAux.add(p.getIdEstadio());
                
                partidas.add(p);
            }
                                   
            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<Campeonato> campeonatos = new CampeonatoDAO().recuperaLista(campeonatosAux);
            Collection<Estadio> estadios = new EstadioDAO().recuperaLista(estadiosAux);
                        
            for (Partida p : partidas) {
                preencheRelacionamentos(times, p, campeonatos, estadios);                
            }
                        
            return partidas;
        } catch (SQLException e){
         throw new RuntimeException(e);
        }    
    }

    private void preencheRelacionamentos(Collection<Time> times, Partida p, Collection<Campeonato> campeonatos, Collection<Estadio> estadios) {
        Iterator<Time> itTimes = times.iterator();
        while(itTimes.hasNext()){
            Time corrente = itTimes.next();
            if (p.getIdTimeMandante() == corrente.getIdTime()){
                p.setTimeMandante(corrente);
                itTimes.remove();
            } else if (p.getIdTimeVisitante() == corrente.getIdTime()){
                p.setTimeVisitante(corrente);
                itTimes.remove();
            }
        }
        Iterator<Campeonato> itCampeonatos = campeonatos.iterator();
        while(itCampeonatos.hasNext()){
            Campeonato corrente = itCampeonatos.next();
            if (p.getIdCampeonato() == corrente.getIdCampeonato()){
                p.setCampeonato(corrente);
                itCampeonatos.remove();
            }                                    
        }
        Iterator<Estadio> itEstadios = estadios.iterator();
        while (itEstadios.hasNext()){
            Estadio corrente = itEstadios.next();
            if (p.getIdEstadio() == corrente.getIdEstadio()){
                p.setEstadio(corrente);
                itEstadios.remove();
            }
        }
    }
    
}
